

/*
client em java utilizando socket e implementado atravez da interface objetoDistribuido
*/

import java.net.*;
import tools.canal.Canal;
import tools.ObjetoDistribuido.ObjetoDistribuido;
import tools.command.commandInterface.Command;;

/**
 * @author rapha
 * Class que será respondavel pelo processo servidor
 */
public class WebServer extends ObjetoDistribuido { 
	

	/**
	 * Declarações iniciais.
	 */
	private static int port;
	private static Socket connection;
	private static StringBuffer msg;
	private static String TimeStamp, returnCode;
	private static int nMsg;
	private static String tipo;
	private static WebServer server;
	private static Command cmd;
	private static Canal canal;



	/*--------------------------------------
	*   	Implementação da interface 	
	*	        Objeto distribuido		
	--------------------------------------*/

	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#usage()
	 */
	public void usage(){
		System.out.println("Usage: \n $java serverDistributed port");
		System.out.println("\t port: \t\t Porto a ser utilizado");
	}

	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#getPort()
	 */
	public int getPort(){
		return WebServer.port;
	}	
	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#setPort(int)
	 */
	public void setPort(int port){
		WebServer.port = port;
	}


	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#setTipo(java.lang.String)
	 */
	public 	void setTipo(String tipo){

		WebServer.tipo = tipo;	
		
	}
	
	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#getTipo()
	 */
	public String getTipo(){

		return WebServer.tipo;
		
	}

	
	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#fecha()
	 */
	public	void fecha(){
		try{
			//WebServer.connection.close();
			canal.closeConnection();			
		}
		catch( Exception e){
			
			System.out.println("Não consegui fechar a conexão");
		}
	}


	
	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#escreve(tools.command.commandInterface.Command)
	 */
	public	void escreve(Command msg){
		
		
		//monta uma resposta
	        returnCode = "\"" + msg + "\":" + " Esta foi a " + getNMsg() + " msg recebida pelo servidor ate agora (" + getTime() + ")" + (char) '&';

		//canal.escreve(returnCode);
	}
	

	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#recebe(tools.command.commandInterface.Command)
	 */
	public void recebe(Command cmd){


			
			while(true){
			

				
				//aguarda a proxima requisicao
				canal.serverProximo();
	
				//Conta a msg recebida
				WebServer.nMsg = WebServer.nMsg + 1;
				System.out.println("Commando numero: " + getNMsg());

				cmd = canal.recebe();	
				executa(cmd,this);	
				
				//envia resposta
				//WebServer.server.escreve( canal.getMsg());

			}


	}

	/* (non-Javadoc)
	 * @see tools.ObjetoDistribuido.ObjetoDistribuido#executa(tools.command.commandInterface.Command)
	 */
	public void executa(Command cmd, ObjetoDistribuido server){
		
		
		System.out.println("Executando Command");
		cmd.executa(server);
	
	} 

	/*--------------------------------------
	*	     Funções próprias		
	--------------------------------------*/

	/**
	 * @param porta - Porto que será utilizado pelo servidor
	 * Construtor parametrizado com o porto
	 */
	public WebServer(int porta){
		WebServer.nMsg=0;
		setPort(porta);
		setTipo("server");
		//Instancia o canal
		canal = new Canal("localhost", porta);
		
		//inicia connection canal
		canal.openConnectionServer();

	}
	/**
	 * Construtor Default
	 */
	public WebServer(){
		WebServer.nMsg=0;
		setPort(2222);
		setTipo("server");
		//Instancia o canal
		canal = new Canal("localhost", 2222);
		
		//inicia connection canal
		canal.openConnectionServer();
	}



	/**
	 * @return Número de mensagens recebidas
	 */
	public int getNMsg(){
		return WebServer.nMsg;
	}

	/**
	 * @return Retorna o Tempo atual
	 */
	public String getTime(){
		TimeStamp = new java.util.Date().toString();

		return TimeStamp;
	}
	

	/**
	 * @param args - Vetor de Strings contendo os parametros necssários a um servidor
	 * Função Principal
	 */
	public static void main(String[] args){

		 //verifica se o numero de parametros esta correto
		 if ( args.length != 1){
			server = new WebServer();
			server.usage();	
		}
		else{

			
			server = new WebServer(Integer.parseInt(args[0]));
			
			System.out.println("Servidor Iniciado na porta " + Integer.parseInt(args[0])); 

			server.recebe(cmd);

			//fecha connection
			server.fecha();

		}
	}
}

